package com.qf.aopLog4j;

import org.apache.log4j.Logger;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
//AOP进行日志管理，环绕式
//当前类为切面类
@Component //将当前类交给spring管理
@Aspect //表示当前类为切面
public class LogAspect {
    //@Around：环绕切点，相当于@Before和@After的综合，
    //由于@After在return之前执行，所以这里就获取不到出参，只能用@Around注解
    //该注解的方法中，只做了两件事，日志记录入参和日志记录出参。
    //@Around注解后的参数表示所有的方法，谁调用就执行该切入点方法
    @Around("execution(public * com.qf.aopLog4j.*.*(..))")
    public void log(ProceedingJoinPoint proceedingJoinPoint){
        //通过ProceedingJoinPoint获取切入点的方法的入参(电脑工厂类或鼠标工厂类，谁调用就执行谁的切入点方法)
        Object[] args = proceedingJoinPoint.getArgs();
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < args.length; i++) {
            builder.append(args[i]+"、");
        }
        //日志记录入参
        Class<? extends ProceedingJoinPoint> aClass = proceedingJoinPoint.getClass();
        Logger logger = Logger.getLogger(aClass);
        logger.info("方法的入参："+builder.toString());

        try {
            //通过ProceedingJoinPoint的proceed()执行切入点方法，并通过proceed()获取返回值
            Object proceed = proceedingJoinPoint.proceed();
            //日志记录出参数
            logger.info("方法结束，返回值："+proceed);
        } catch (Throwable throwable) {
            throwable.printStackTrace();
            //日志记录异常
            logger.error(throwable.getMessage());
        }
    }
}
